import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from matplotlib import dates as mdates

# 设置中文显示（如果需要）
plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False  # 用来正常显示负号

# 读取数据
df = pd.read_csv('data.csv')

# 1. 数据概览
print("数据概览:")
print(df.info())
print("\n前5行数据:")
print(df.head())

# 2. 年份分布
plt.figure(figsize=(12, 6))
sns.countplot(x='year', data=df)
plt.title('每年歌曲数量分布')
plt.xticks(rotation=45)
plt.tight_layout()
plt.show()

# 3. 音乐特征随时间变化
features = ['danceability', 'energy', 'valence', 'acousticness', 'liveness', 'speechiness']

plt.figure(figsize=(15, 10))
for i, feature in enumerate(features, 1):
    plt.subplot(3, 2, i)
    sns.lineplot(x='year', y=feature, data=df, ci=None)
    plt.title(f'{feature} 随时间变化')
    plt.xticks(rotation=45)
plt.tight_layout()
plt.show()

# 4. 流行度分析
plt.figure(figsize=(12, 6))
sns.boxplot(x='year', y='popularity', data=df)
plt.title('每年歌曲流行度分布')
plt.xticks(rotation=45)
plt.tight_layout()
plt.show()

# 5. 音乐特征相关性热图
plt.figure(figsize=(12, 8))
corr = df[features + ['tempo', 'loudness', 'popularity']].corr()
sns.heatmap(corr, annot=True, cmap='coolwarm', center=0)
plt.title('音乐特征相关性热图')
plt.tight_layout()
plt.show()

# 6. 艺术家分析（前20位）
# 处理艺术家列（可能有多个艺术家）
df['artists'] = df['artists'].str.replace("[", "").str.replace("]", "").str.replace("'", "")
all_artists = df['artists'].str.split(', ').explode()

plt.figure(figsize=(12, 6))
top_artists = all_artists.value_counts().head(20)
sns.barplot(x=top_artists.values, y=top_artists.index)
plt.title('作品数量最多的前20位艺术家')
plt.xlabel('歌曲数量')
plt.tight_layout()
plt.show()

# 7. 音乐特征分布
plt.figure(figsize=(15, 10))
for i, feature in enumerate(features, 1):
    plt.subplot(3, 2, i)
    sns.histplot(df[feature], kde=True)
    plt.title(f'{feature} 分布')
plt.tight_layout()
plt.show()

# 8. 时长分析
df['duration_min'] = df['duration_ms'] / 60000  # 转换为分钟

plt.figure(figsize=(12, 6))
sns.boxplot(x='year', y='duration_min', data=df)
plt.title('歌曲时长随时间变化')
plt.ylabel('时长(分钟)')
plt.xticks(rotation=45)
plt.tight_layout()
plt.show()

# 9. 调性和模式分析
plt.figure(figsize=(12, 6))
plt.subplot(1, 2, 1)
sns.countplot(x='key', data=df)
plt.title('调性分布')

plt.subplot(1, 2, 2)
sns.countplot(x='mode', data=df)
plt.title('模式分布 (0=小调, 1=大调)')
plt.tight_layout()
plt.show()

# 10. 显式内容分析
if 'explicit' in df.columns:
    plt.figure(figsize=(8, 5))
    sns.countplot(x='explicit', data=df)
    plt.title('显式内容歌曲数量 (0=非显式, 1=显式)')
    plt.show()

# 11. 乐器性与声学性关系
plt.figure(figsize=(10, 6))
sns.scatterplot(x='instrumentalness', y='acousticness', data=df, alpha=0.6)
plt.title('乐器性与声学性关系')
plt.tight_layout()
plt.show()

# 12. 能量与响度关系
plt.figure(figsize=(10, 6))
sns.scatterplot(x='energy', y='loudness', data=df, alpha=0.6)
plt.title('能量与响度关系')
plt.tight_layout()
plt.show()

# 13. 音乐特征雷达图（按年份平均）
years = df['year'].unique()
mean_features = df.groupby('year')[features].mean().reset_index()

# 标准化数据用于雷达图
from sklearn.preprocessing import MinMaxScaler
scaler = MinMaxScaler()
radar_data = pd.DataFrame(scaler.fit_transform(mean_features[features]),
                         columns=features,
                         index=mean_features['year'])

# 选择几个代表性年份绘制雷达图
selected_years = [1921, 1922, 1923, 1924]
plt.figure(figsize=(10, 10))
ax = plt.subplot(111, polar=True)

for year in selected_years:
    values = radar_data.loc[year].tolist()
    values += values[:1]  # 闭合雷达图
    angles = np.linspace(0, 2*np.pi, len(features)+1)
    ax.plot(angles, values, label=str(year))
    ax.fill(angles, values, alpha=0.1)

ax.set_theta_offset(np.pi/2)
ax.set_theta_direction(-1)
ax.set_thetagrids(np.degrees(angles[:-1]), features)
plt.title('不同年份音乐特征雷达图比较')
plt.legend(loc='upper right', bbox_to_anchor=(1.3, 1.1))
plt.tight_layout()
plt.show()

# 14. 最受欢迎歌曲分析
top_songs = df.sort_values('popularity', ascending=False).head(10)

plt.figure(figsize=(12, 6))
sns.barplot(x='popularity', y='name', data=top_songs, hue='year', dodge=False)
plt.title('最受欢迎的10首歌曲')
plt.xlabel('流行度')
plt.ylabel('歌曲名称')
plt.tight_layout()
plt.show()